package cn.itcast.nems.studentrecord.dao.mapper;

import cn.itcast.nems.studentrecord.dao.dataobject.StudentRecordFundFlowInfoDO;
import cn.itcast.nems.studentrecord.dao.dataobject.StudentRecordFundFlowSchoolChannelDO;
import cn.itcast.nems.studentrecord.dao.dataobject.StudentTotalRefundableAmountDO;
import cn.itcast.nems.studentrecord.dao.entity.StudentRecordFundFlow;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * <p>
 * 学籍资金流转明细;资金流：学籍上汇聚和所有凭单上的正反向的所有资金流水。比如报名订单、转班凭单、退费单等。注：有发生资金变化时纪录该表，但只在实际发生时再纪录！ Mapper 接口
 * </p>
 *
 * @author liyong
 * @since 2023-11-14
 */
@Mapper
public interface StudentRecordFundFlowMapper extends BaseMapper<StudentRecordFundFlow> {
    /**
     * <p>
     * 根据学籍ID、凭单ID和凭单类型查询学籍流水
     * </p>
     *
     * @param studentRecordId 学籍ID
     * @param referenceId 凭单ID
     * @param referenceType  凭单类型
     * @author zhouwei
     * @since 2024/4/16 5:04 PM
     **/
    List<StudentRecordFundFlow> selectByStudentRecordIdAndReferenceIdAndReferenceType(@Param("studentRecordId") String studentRecordId,
                                                                                @Param("referenceId") String referenceId,
                                                                                @Param("referenceType") String referenceType);

    /**
     * 根据学籍及支付单号查询支付流水
     *
     * @param studentRecordId 学籍ID
     * @param paymentNo       支付单号
     * @return 支付流水
     */
    StudentRecordFundFlow selectByStudentRecordIdPaymentNo(@Param("studentRecordId") String studentRecordId,
                                                           @Param("paymentNo") String paymentNo);

    /**
     * 根据学籍及凭单信息查询支付流水
     *
     * @param studentRecordId 学籍ID
     * @param referenceId     凭单ID
     * @param referenceLineId 凭单行ID
     * @return 支付流水
     */
    List<StudentRecordFundFlow> selectByStudentRecordIdReference(@Param("studentRecordId") String studentRecordId,
                                                                 @Param("referenceId") String referenceId,
                                                                 @Param("referenceLineId") String referenceLineId);

    /**
     * 功能描述: 学员信息查询-学籍信息-支付信息
     *
     * @return
     * @param    studentRecordId 学籍编号
     * @author 陈早庆
     * @update:[变更日期2023年12月05日][更改人姓名][变更描述]
     * @since 2023年12月05日
     */
    List<StudentRecordFundFlowInfoDO> listStudentRecordFundFlowInfo(@Param("studentRecordId") String studentRecordId, @Param("paymentNo") String paymentNo);

    List<StudentRecordFundFlowSchoolChannelDO> selectByStudentRecordIdClazzId(@Param("studentRecordId") String studentRecordId, @Param("clazzId") Integer clazzId);

    /**
     * 
     * 功能描述：获取学生实际支付总额、实际退费总额
     * <p/>
     * 学生实际支付总额 = SUM(在线支付) + SUM(离线支付)  <br/>
     * 学生实际退费总额 = SUM(退费) + SUM(退费退回)     <br/>
     * 
     * @param studentId 学生ID
     * @return 学生实际支付总额、学生实际退费总额、学生可退费最大金额
     * 
     * @author 刘曙
     *
     * @since 2024年3月19日
     *
     * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
     */
    StudentTotalRefundableAmountDO getStudentActualPaymentAndActualRefund(final Integer studentId);
}
